package com.lanmao.emc.dao;

import com.lanmao.emc.entity.FeIndexLogPO;
import com.lanmao.emc.entity.FeVersionPO;
import com.lanmao.emc.entity.VersionInfo;
import com.lanmao.emc.entity.VersionUsedInfo;
import com.lanmao.emc.enums.DBType;
import org.springframework.beans.factory.InitializingBean;

import java.util.List;

/**
 * 描述：
 *
 * @author lanmao
 * @since 2024年11月11日 20:39
 */
public interface UpgradeDao extends InitializingBean {
    /**
     * 查询当前最新版本
     */
    FeVersionPO findLastVersion();

    /**
     * 查询所有版本
     */
    List<FeVersionPO> findAllVersion();

    /**
     * 判断是否所有表都存在
     *
     * @param tables 表列表
     * @return 是否都存在
     */
    boolean allTableExist(String... tables);

    /**
     * 批量保存索引升级信息
     *
     * @param list 需要保存的记录
     */
    void batchSave(List<FeIndexLogPO> list);

    /**
     * 批量保存表
     *
     * @param list 表sql列表、或者mapping列表
     */
    void batchupdate(List<String> list);

    /**
     * 根据索引名查询其所有版本升级成功记录
     *
     * @param indexName 索引名
     * @return 成功的升级记录
     */
    List<VersionUsedInfo> findAllVersionByIndexName(String indexName);

    /**
     * 根据索引和版本更新使用状态，将其都设为0
     *
     * @param index   需要修改的索引
     * @param version 需要修改的版本
     */
    void updateIsUsedByIndexAndVersion(String index, String version);

    /**
     * 将使用中的索引记录使用状态设为0
     *
     * @param indexList 需要被修改的索引列表
     */
    void updateIsUsedByIndexName(List<String> indexList);

    /**
     * 根据索引名删除记录
     *
     * @param indexList 索引列表
     */
    void deleteByIndexRelName(List<String> indexList);

    /**
     * 查询最新升级记录失败的索引记录
     *
     * @return 失败的索引记录集合
     */
    List<VersionInfo> findAllLastErrorIndex();

    DBType getDbType();

    @Override
    default void afterPropertiesSet() {
        UpgradeDaoFactory.DB_MAP.put(getDbType(), this);
    }

    /**
     * 保存版本信息
     *
     * @param feVersion 版本信息
     */
    void saveVersion(FeVersionPO feVersion);
}